package fejezet20;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class NyolcasJátek extends JApplet
    implements ActionListener {
  private JPanel pnJáték=new JPanel(null);
  private JButton[][] btNégyzet=new JButton[4][4];
  private int lyukX=3, lyukY=3, lépésDb=0;
  private JButton btKever=new JButton("Kever");
  private JLabel lbLépés=new JLabel("Lépés: "+lépésDb);

  @Override
  public void init() {
    setSize(400, 300);
    setLayout(null);
    int felirat=1;
    Font betűtípus=new Font("Arial", Font.BOLD, 24);
    for(int sor=1; sor<=3; sor++)
      for(int oszlop=1; oszlop<=3; oszlop++) {
        btNégyzet[sor][oszlop]=new JButton(""+felirat++);
        btNégyzet[sor][oszlop].setBounds(
          (oszlop-1)*80, (sor-1)*80, 80, 80);
        pnJáték.add(btNégyzet[sor][oszlop]);
        btNégyzet[sor][oszlop].setFont(betűtípus);
        btNégyzet[sor][oszlop].addActionListener(this);
      }
    btNégyzet[lyukX][lyukY].setText("0");
    btNégyzet[lyukX][lyukY].setEnabled(false);
    pnJáték.setBounds(0, 0, 250, 250);
    add(pnJáték);
    btKever.setBounds(280, 80, 80, 80);
    add(btKever);
    btKever.addActionListener(this);
    lbLépés.setBounds(290, 200, 80, 20);
    add(lbLépés);
  }

  public void actionPerformed(ActionEvent e) {
    JButton bt=(JButton)e.getSource();
    if(bt!=btKever) {
      if(négyzetCserél(bt)) {
        lbLépés.setText("Lépés: "+(++lépésDb));
        if(nyert()) {
          lbLépés.setForeground(Color.RED);
          lbLépés.setText("Ön nyert!");
          pnJáték.setVisible(false);
        }
      }
    }
    else {
      lbLépés.setForeground(Color.BLACK);
      lbLépés.setText("Lépés: "+(lépésDb=0));
      pnJáték.setVisible(true);
      négyzetKever();
    }
  }

  private boolean négyzetCserél(JButton bt) {
    Point gomb=bt.getLocation();
    Point lyuk=btNégyzet[lyukX][lyukY].getLocation();
    boolean lyukSzomszéd=
      ((gomb.x==lyuk.x) && (Math.abs(gomb.y-lyuk.y)==80) ||
       (gomb.y==lyuk.y) && (Math.abs(gomb.x-lyuk.x)==80));
    if(lyukSzomszéd) {
      bt.setLocation(lyuk);
      btNégyzet[lyukX][lyukY].setLocation(gomb);
    }
    return lyukSzomszéd;
  }

  private void négyzetKever() {
    int sor, oszlop, csereDb=0;
    do {
      sor=(int)(Math.random()*3+1);
      oszlop=(int)(Math.random()*3+1);
      if(négyzetCserél(btNégyzet[sor][oszlop]))
        csereDb++;
    } while(csereDb<=20);
  }

  private boolean nyert() {
    int helyénVanDb=0;
    for(int sor=1; sor<=3; sor++)
      for(int oszlop=1; oszlop<=3; oszlop++)
        if(btNégyzet[sor][oszlop].getLocation().equals(
            new Point((oszlop-1)*80, (sor-1)*80)))
          helyénVanDb++;
    return (helyénVanDb==9);
  }
}